import os
import sys
import logging.handlers
import time

from celery import Celery, Task
from celery.utils.log import get_task_logger
from datetime import timedelta
from kombu import Queue

# 获取绝对路径
project_path = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
sys.path.append(project_path)
from utils.common_util import CommonUtil
from config import CELERY_REDIS
from libs.redis_wrapper import RedisWrapper


data_app = Celery("data_app")
data_app.conf.update(
    result_expires=timedelta(minutes=20),  # 结果过期时间为 20 分钟
    task_serializer='json',
    broker_url=CELERY_REDIS,
    result_backend=CELERY_REDIS,
    task_default_queue='original_data_task',  # 默认队列名称
    task_queues=(
        Queue('original_data_task_queue', routing_key='task.original_data_task'),
        Queue('standard_data_task_queue', routing_key='task.standard_data_task'),
        Queue('primary_review_data_task_queue', routing_key='task.primary_review_data_task'),
    ),  # celery应用程序中使用的队列列表
    task_default_exchange_type='direct',  # 交换机
    task_default_routing_key='task.original_data_task',  # 默认路由键
    timezone='Asia/Shanghai',
    task_routes={  # 任务函数对应的队列和路由键
        'original_data_task': {
            'queue': 'original_data_task_queue',
            'routing_key': 'task.original_data_task',
        },
        'standard_data_task': {
            'queue': 'standard_data_task_queue',
            'routing_key': 'task.standard_data_task',
        },
        'primary_review_data_task': {
            'queue': 'primary_review_data_task_queue',
            'routing_key': 'task.primary_review_data_task',
        },
    }
)

# 获取默认的日志记录器
logger = get_task_logger(__name__)

# 配置文件日志处理器
celery_logs_url = CommonUtil.get_path_by_system_version([project_path, "celery_logs/celery.log"])
file_handler = logging.handlers.TimedRotatingFileHandler(celery_logs_url,
                                                         when='midnight', backupCount=7, encoding='utf8')
formatter = logging.Formatter("%(asctime)s %(levelname)s %(message)s", datefmt="%Y-%m-%d %H:%M:%S")
file_handler.setFormatter(formatter)

# 添加文件日志处理器到默认的日志记录器
logger.addHandler(file_handler)
# data_app.autodiscover_tasks(['data_app.tasks'])


# 回调类
class CallBack(Task):
    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.logger = logger

    def on_success(self, retval, task_id, args, kwargs):
        """
        retval: 任务成功执行后的返回值。如果任务没有显式指定返回值，则为None
        task_id: 任务的唯一标识符，可以用于跟踪和识别任务
        args: 任务的位置参数（非关键字参数）列表
        kwargs: 任务的关键字参数（键值对）字典
        """
        self.logger.info("异步成功")
        self.logger.info(f"任务成功返回值：{retval}")
        self.logger.info(f"任务ID：{task_id}")
        self.logger.info(f"位置参数：{args}, 关键字参数：{kwargs}")

    def on_failure(self, exc, task_id, args, kwargs, einfo):
        """
        exc: 异常对象，表示任务执行过程中引发的异常
        task_id:任务id
        args: 位置参数
        kwargs: 关键字参数
        einfo: 异常信息对象，包含关于异常的详细信息，如异常类型、异常消息等
        """
        self.logger.info("异步失败")
        self.logger.info(f"任务id:{task_id}")
        self.logger.info(f"位置参数：{args}, 关键字参数：{kwargs}")
        self.logger.info(f"异常信息：{einfo.exception}")




